package tools

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

var (
	lines   []string // 存储文件内容
	mode    string   // 当前模式（normal/insert）
	cursorX int      // 光标列位置
	cursorY int      // 光标行位置
	filename string  // 文件名
)

// 初始化编辑器
func initEditor() {
	mode = "normal"
	cursorX = 0
	cursorY = 0
}

// 显示编辑器界面
func render() {
	// 清屏
	fmt.Print("\033[H\033[2J")

	// 显示文件内容
	for i, line := range lines {
		if i == cursorY {
			fmt.Printf("> %s\n", line)
		} else {
			fmt.Printf("  %s\n", line)
		}
	}

	// 显示状态栏
	fmt.Printf("\n-- %s --\n", mode)
	fmt.Printf("光标位置: %d:%d\n", cursorY+1, cursorX+1)
	fmt.Println("按 i 进入插入模式，按 ESC 返回普通模式，按 :w 保存，按 :q 退出")
}

// 处理普通模式输入
func handleNormalMode(input string) {
	switch input {
	case "i":
		mode = "insert" // 进入插入模式
	case "h":
		if cursorX > 0 {
			cursorX--
		}
	case "j":
		if cursorY < len(lines)-1 {
			cursorY++
		}
	case "k":
		if cursorY > 0 {
			cursorY--
		}
	case "l":
		if cursorX < len(lines[cursorY]) {
			cursorX++
		}
	case ":w":
		saveFile() // 保存文件
	case ":q":
		os.Exit(0) // 退出编辑器
	}
}

// 处理插入模式输入
func handleInsertMode(input string) {
	line := lines[cursorY]
	lines[cursorY] = line[:cursorX] + input + line[cursorX:]
	cursorX += len(input)
}

// 保存文件
func saveFile() {
	file, err := os.Create(filename)
	if err != nil {
		fmt.Println("保存文件失败:", err)
		return
	}
	defer file.Close()

	writer := bufio.NewWriter(file)
	for _, line := range lines {
		_, err := writer.WriteString(line + "\n")
		if err != nil {
			fmt.Println("保存文件失败:", err)
			return
		}
	}
	writer.Flush()
	fmt.Println("文件已保存。")
}

// 主函数
func Vim() {
	if len(os.Args) < 2 {
		fmt.Println("使用方法: vi <文件名>")
		return
	}

	filename = os.Args[1]

	// 读取文件内容
	file, err := os.Open(filename)
	if err == nil {
		scanner := bufio.NewScanner(file)
		for scanner.Scan() {
			lines = append(lines, scanner.Text())
		}
		file.Close()
	}

	initEditor()

	// 主循环
	reader := bufio.NewReader(os.Stdin)
	for {
		render()

		input, _ := reader.ReadString('\n')
		input = strings.TrimSpace(input)

		switch mode {
		case "normal":
			handleNormalMode(input)
		case "insert":
			if input == "\x1b" { // ESC 键
				mode = "normal"
			} else {
				handleInsertMode(input)
			}
		}
	}
}
